﻿using System;
using System.Collections.Generic;
using System.Text;
using TPDiseño.Clases_de_Entidad;
using DAO.DataSetConsultoraTableAdapters;
using System.Data.SqlClient;


namespace DAO
{
    public class DAOPuesto : DAO
    {
        //Atributos de manejo de instancia (singleton)
        static DAOPuesto instance = null;  
        // Atributos para acceso a los DataSet Tipados
        private DataSetConsultora.PuestoDataTable puestosTabla = new DataSetConsultora.PuestoDataTable();
        private PuestoTableAdapter puestosTableAdapter = new PuestoTableAdapter();
        // Dependencias de otros DAOs
        private DAOEmpresa miDAOEMpresa = DAOEmpresa.Instance;
        private DAOCompetencia_Ponderada miDAOCompetencia_Ponderada = DAOCompetencia_Ponderada.Instance;


        public static DAOPuesto Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new DAOPuesto();
                        }
                    }
                }
                return instance;
            }
        }
        
        public DAOPuesto()
        {

        }



        public Puesto guardar(Puesto unPuesto)
        {


            // Inserto el puesto en la db por medio de su table adapter
            puestosTabla = puestosTableAdapter.Insertar(unPuesto._nombre, unPuesto._descripcion, unPuesto._empresa._cod_empresa, unPuesto._cod_puesto);


            foreach (PuestoCompetencia pc in unPuesto._competenciasPonderadas)
            {
                miDAOCompetencia_Ponderada.guardar(pc, puestosTabla[0].id);
            }


            // Devuelvo el puesto insertado
            return recolectarUno();
        }

        public List<Puesto> cargar()
        {

            // Cargo todos los puesto de la db

            puestosTabla = puestosTableAdapter.GetData();

            return recolectar();

        }

        public List<Puesto> cargar(string codP, string nomP, string emp, string desc)
        {

            // Cargo todos los puesto de la db

            puestosTabla = puestosTableAdapter.ConsultarPorCodPNomPEmpDescP(nomP,codP,desc,emp);

            return recolectar();

        }


        public List<Puesto> cargar(int cod_empresa)
        {

            // Cargo los puesto de la db correspondientes al codigo de evaluacion
            puestosTabla = puestosTableAdapter.ConsultarPorEmpresa(cod_empresa);

            return recolectar();

        }

        public Puesto cargarUno(int unId)
        {
            // obtengo un puesto por su id en puestoTabla
            puestosTabla = puestosTableAdapter.Consultar(unId);

            // Finalmente retorno un nuevo objeto Puesto mapeado de la tabla 
            return recolectarUno();
        }
       
        public List<Puesto> cargar(string unNombre)
        {

            // obtengo un puesto por su id en puestoTabla
            puestosTabla = puestosTableAdapter.ConsultarPorNombre(unNombre);

            // Finalmente retorno un nuevo objeto Puesto mapeado de la tabla 
            return recolectar();

        }



        public List<Puesto> recolectar()
        {

            // Creo la lista para recolectar y devolver los puestos cargados de la db
            List<Puesto> puestosCargados = new List<Puesto>();

            // Recorro los puestos de la tabla
            foreach (DataSetConsultora.PuestoRow unPuestoFila in puestosTabla)
            {

                // Creo un puesto con sus propiedades y lo agrego a la lista de puestos cargados
                puestosCargados.Add(new Puesto(unPuestoFila.id,
                                               unPuestoFila.codigo,
                                               unPuestoFila.nombre,
                                               unPuestoFila.descripcion,
                                               miDAOEMpresa.cargar(unPuestoFila.Empresacod_empresa),
                                               miDAOCompetencia_Ponderada.cargar(unPuestoFila.id)
                                             )
                                    );

            }

            // Finalmente devuelvo la lista de puestosCargados            
            return puestosCargados;
        }

        private Puesto recolectarUno()
        {

            if (puestosTabla.Count > 0)
            {
                return new Puesto(puestosTabla[0].id,
                                  puestosTabla[0].codigo,
                                  puestosTabla[0].nombre,
                                  puestosTabla[0].descripcion,
                                  miDAOEMpresa.cargar(puestosTabla[0].Empresacod_empresa),
                                  miDAOCompetencia_Ponderada.cargar(puestosTabla[0].id)
                                  );
            }
            else
            {
                return new Puesto();
            }
        }

    }
}